package com.ow.dva.module.park.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ow.dva.module.base.controller.BaseController;
import com.ow.dva.module.base.entity.json.RT;
import com.ow.dva.module.base.entity.param.DvaPage;
import com.ow.dva.module.park.entity.ParkArea;
import com.ow.dva.module.park.entity.Parkinglot;
import com.ow.dva.module.park.service.ParkAreaService;
import com.ow.dva.module.park.service.ParkService;
import com.ow.dva.module.park.service.ParkinglotService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 停车场区域表 前端控制器
 * </p>
 *
 * @author YanZengBao
 * @since 2020-02-19
 * @version V1.0
 */
@Controller
@Api(tags = "停车场区域表 相关控制器")
@RequestMapping("/parkArea")
public class ParkAreaController extends BaseController {

    /**
    * 分页获取停车场区域表数据列表信息
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "分页获取",notes = "批量获取停车场区域表信息列表，分页，可携带条件")
    @RequiresPermissions("parkArea:page")
    @GetMapping(value = "/page")
    public String page(DvaPage<ParkArea> dvaPage, @RequestParam Map<String, Object> param, Model model){

        DvaPage<ParkArea> page = parkAreaService.page(dvaPage,param);
        model.addAttribute("page",page);
        model.addAttribute("param",param);
        return "parkArea/list";
    }

    /**
    * 进入停车场区域表添加页面。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "进入添加页面",notes = "进入停车场区域表添加页面")
    @RequiresPermissions("parkArea:add")
    @GetMapping(value = "/add")
    public String add(Model model){
        model.addAttribute("parkList",parkService.getParkList());
        return "parkArea/add";
    }

    /**
    * 添加停车场区域表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "添加",notes = "添加单个停车场区域表信息")
    @RequiresPermissions("parkArea:add")
    @PostMapping("/save")
    @ResponseBody
    public RT save(ParkArea parkArea){
        int count = parkAreaService.count(new QueryWrapper<ParkArea>()
                .eq("number", parkArea.getNumber())
                .eq("park_id",parkArea.getParkId()));
        if(count > 0) return RT.error(1,"停车场区域编号重复");

//        Park park = parkService.getById(parkArea.getParkId());
//        if(park != null){
//            parkArea.setParkName(park.getName());
//        }
        parkArea.setCreateTime(new Date());
        parkArea.setAreaType(0);//分区类型

        return parkAreaService.save(parkArea) ? RT.ok("添加成功") : RT.error(1,"添加失败！");
    }

    /**
    * 进入停车场区域表编辑页面。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "进入编辑页面",notes = "进入停车场区域表编辑页面")
    @RequiresPermissions("parkArea:edit")
    @GetMapping(value = "/edit")
    public String edit(String id,Model model){
        model.addAttribute("data",parkAreaService.getById(id));
        return "parkArea/edit";
    }

    /**
    * 修改停车场区域表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "修改",notes = "修改单个停车场区域表信息")
    @RequiresPermissions("parkArea:edit")
    @PostMapping("/update")
    @ResponseBody
    public RT update(ParkArea parkArea){
        //原分区信息
        ParkArea oldParkArea = parkAreaService.getById(parkArea.getId());

        ParkArea one = parkAreaService.getOne((new QueryWrapper<ParkArea>()
                .eq("number", parkArea.getNumber())
                .eq("park_id", oldParkArea.getParkId())));
        if(one != null) {
            if(oldParkArea.getId().equals(one.getId())){
                return parkAreaService.updateById(parkArea) ? RT.ok("修改成功！") : RT.error(1,"修改失败！");
            }else {
                return RT.error(1,"停车场分区编号已存在");
            }
        }else{
            return parkAreaService.updateById(parkArea) ? RT.ok("修改成功！") : RT.error(1,"修改失败！");
        }
    }

    /**
    * 删除单个停车场区域表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-03-12 YanZengBao   并解绑其相关信息（车位 和车道）
    * 修改时间：
    */
    @ApiOperation(value = "删除",notes = "删除单个停车场区域表信息")
    @RequiresPermissions("parkArea:delete")
    @PostMapping("/delete")
    @ResponseBody
    public RT delete(@ApiParam(name="要删除的停车场区域表ID") String id){

        return parkAreaService.deleteParkAreaInfo(id) ? RT.ok("删除成功！") : RT.error(1,"删除失败！");
    }

    /**
    * 批量删除多个停车场区域表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "批量删除",notes = "批量删除多个停车场区域表信息")
    @RequiresPermissions("parkArea:delete")
    @PostMapping("/deleteByIds")
    @ResponseBody
    public RT deleteByIds(@ApiParam(name="要删除的停车场区域表ID List") @RequestParam List<String> ids){

        return parkAreaService.removeByIds(ids) ? RT.ok() : RT.error(1);
    }


    /**
     * 描述： 点击绑定弹出车位绑定页面
     * 创建时间： 2020/2/24 YanZengBao
     * 修改时间： 2020/2/24 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "进入绑定车位列表页面",notes = "进入绑定车位列表页面")
    @GetMapping(value = "/bindParkinglotHtml")
    public String bindParkinglotHtml(String areaId,Model model){

        List<Parkinglot> parkinglotList = new ArrayList<>();
        ParkArea parkArea = parkAreaService.getById(areaId);
        if(parkArea != null){
            parkinglotList = parkinglotService.list(new QueryWrapper<Parkinglot>().eq("park_id",parkArea.getParkId())
                                                                                    .orderByAsc("parkinglot_code"));
        }
        model.addAttribute("areaId",areaId);
        model.addAttribute("parkinglotList",parkinglotList);
        return "parkArea/bindParkinglot";
    }


    /**
     * 描述：车位绑定页面单个车位绑定
     * 创建时间： 2020/2/25 YanZengBao
     * 修改时间： 2020/2/25 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "绑定车位",notes = "区域分配车位")
    @PostMapping("/bindParkinglot")
    @ResponseBody
    public RT bindParkinglot(String id, String areaId){

        //查询分区
        ParkArea parkArea = parkAreaService.getById(areaId);;
        if(parkArea == null) return RT.error(1,"区域信息有误");
        Parkinglot parkinglot = parkinglotService.getById(id);
        if(parkinglot != null){
            if(parkinglot.getStatus() == 1){
                return RT.error(2,"绑定失败！数据异常！所选车位已被绑定！");
            }
            parkinglot.setStatus(1);//修改车位绑定分区状态
            parkinglot.setAreaId(areaId);
            parkinglot.setAreaName(parkArea.getName());

            return parkinglotService.updateById(parkinglot) ? RT.ok("绑定成功！") : RT.error(1,"绑定失败！");
        }else{
            return RT.error(1,"绑定失败！");
        }
    }


    /**
     * 描述：绑定车位
     * 创建时间： 2020/1/12 YanZengBao
     * 修改时间： 2020/1/12 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "快速绑定车位",notes = "区域分配车位")
    @PostMapping("/bindParkinglotBatch")
    @ResponseBody
    public RT bindParkinglotBatch(@ApiParam(name="停车场车位ids") @RequestParam List<String> ids, @RequestParam String areaId){

        List<Parkinglot> parkinglots = new ArrayList<>();
        //查询分区
        ParkArea parkArea = parkAreaService.getById(areaId);;
        if(parkArea == null) return RT.error(1,"区域信息有误");

        for (String str: ids) {
            Parkinglot parkinglot = parkinglotService.getById(str);
            if(parkinglot != null){
                if(parkinglot.getStatus() == 1){
                    return RT.error(2,"绑定失败！不可选择已绑定区域的车位，请重新选择！");
                }
                parkinglot.setStatus(1);//修改车位绑定分区状态
                parkinglot.setAreaId(areaId);
                parkinglot.setAreaName(parkArea.getName());
                parkinglots.add(parkinglot);
            }
        }
        return parkinglotService.updateBatchById(parkinglots) ?  RT.ok("绑定成功！") : RT.error(1,"绑定失败！");
    }


    /**
     * 描述： 根据停车场ID查询区域
     * 创建时间： 2020/2/26 YanZengBao
     * 修改时间： 2020/2/26 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "根据停车场ID查询区域",notes = "根据停车场ID查询区域")
    @PostMapping(value = "/findAreaByparkId")
    @ResponseBody
    public RT findAreaByparkId(String parkId){
        List<ParkArea> parkAreaList = parkAreaService.list(new QueryWrapper<ParkArea>().eq("park_id",parkId));
        return RT.ok(parkAreaList);
    }


    @Resource
    ParkAreaService parkAreaService;
    @Resource
    ParkService parkService;
    @Resource
    ParkinglotService parkinglotService;
}
